import { BaseTool } from '../types';
import { httpsRequest } from '../../utils/proxy';
import { configManager } from '../../utils/config';
const DEFAULT_COUNT = 20;
interface BraveSearchResult {
  title: string;
  url: string;
  description: string;
}

interface BraveSearchResponse {
  web?: {
    results: BraveSearchResult[];
  };
  type?: string;
  status?: number;
}

export class SearchTool extends BaseTool {
  name = 'web_search';
    description = `使用 Brave Search API 在互联网上搜索信息

使用原则：
**应该搜索的情况：**
1. 用户明确要求"搜索"、"查找"、"找到"等关键词
2. 询问最新、实时、当前的信息（如：最新新闻、当前股价、今日天气）
3. 询问具体的事实、数据、统计信息（如：人口数据、公司信息、产品价格）
4. 需要验证或确认某个信息的准确性
5. 询问专业领域的最新发展或研究成果
6. 寻找特定的资源、教程、工具或服务

**不应该搜索的情况：**
1. 询问基础概念、定义、常识问题（如：什么是机器学习、Python语法）
2. 请求创建、编写、设计任务（如：写代码、写文章、设计方案）
3. 数学计算、逻辑推理、算法问题
4. 个人建议、情感支持、主观判断
5. 已知的历史事件、经典理论、标准流程
6. 纯聊天、问候、感谢等日常对话

**单次搜索 vs 多次搜索决策：**

**进行一次搜索的情况：**
1. 询问单一、明确的事实问题（如：某公司股价、某地天气、特定产品价格）
2. 搜索特定的资源或工具（如：Python教程、特定软件下载）
3. 验证单一信息的准确性
4. 用户明确指定搜索词或范围很窄的问题
5. 时效性强的单一事件查询（如：今日新闻、最新发布）

**进行多次搜索的情况：**
1. 需要对比分析的问题（如：对比不同产品、技术方案比较）
2. 复杂的研究性问题需要多个角度信息（如：行业发展趋势、综合分析）
3. 第一次搜索结果不够全面，需要补充更多信息
4. 涉及多个相关主题的综合性问题
5. 需要不同语言信息源的国际性话题
6. 用户明确要求"详细搜索"、"深入了解"、"全面分析"

决策伪代码：
if (用户明确要求搜索 || 包含"最新"/"实时"/"当前"等时效性词汇) {
    if (单一明确问题 || 特定事实查询) {
          进行一次搜索;
    } else if (复杂分析 || 对比研究 || 综合性问题) {
          进行多次搜索;
    }
} else if (询问具体事实数据 || 需要验证信息 || 寻找资源) {
    if (问题范围明确且单一) {
          进行一次搜索;
    } else {
          进行多次搜索;
    }
} else if (基础概念 || 创建任务 || 计算问题 || 个人建议 || 历史常识) {
      不应该搜索;
} else {
    // 模糊情况，根据具体内容判断
    if (更偏向于需要外部信息) {
        if (问题简单直接) {
              进行一次搜索;
        } else {
              进行多次搜索;
        }
    } else {
          不应该搜索;
    }
}
你需要自主判断，搜索得到的结果是否需要进行page_fetch 以获得进一步信息！
进行多次搜索意味着你需要根据连接 进行page_fetch 以获得进一步信息！

重要事项:
你有自主性，你需要灵活判断使用的搜索语言，如果信息和某个国家相关，请使用该国家的语言进行搜索，以获得一手信息。
如果你知道某个特定网站会有用户需要的消息来源，你可以在search中带上该网站域名。
例如 用户询问 switch2有哪些新游戏，请使用日语进行搜索 "スイッチ2 新作ゲーム ニュース"。
例如 用户询问 openai有哪些新功能，请使用英语进行搜索 "openai new features 2024"。
最后无论你用什么语言搜索，你都需要用中文回答。
调用示例：
用户："搜索最新的AI技术发展"
你应该回复：我来为您搜索AI技术发展的最新信息
<function_calls>
<invoke name="web_search">
<parameter name="query">最新AI技术发展</parameter>
</invoke>
</function_calls>

用户："搜索Python编程教程，返回10个结果"
你应该回复：我来为您搜索Python编程教程
<function_calls>
<invoke name="web_search">
<parameter name="query">Python编程教程</parameter>
<parameter name="count">10</parameter>
</invoke>
</function_calls>`;
 
    parameters = {     
      properties: {
      query: {
        type: 'string',
        description: '搜索关键词或问题'
      },
      count: {
        type: 'number',
        description: '返回结果数量，默认为20，最大40',
        default: DEFAULT_COUNT,
        minimum: 1,
        maximum: 40
      }
    },
    required: ['query']
  };

  private apiKey: string;

  constructor() {
    super();
    this.apiKey = configManager.getBraveSearchApiKey();
    if (!this.apiKey) {
      throw new Error('Brave Search API Key 未配置，请检查配置文件');
    }
  }

  async execute(args: { query: string; count?: number }): Promise<string> {
    try {
      const { query, count = DEFAULT_COUNT } = args;
      const results = await this.braveSearch(query, count);
      return this.formatResults(query, results);
    } catch (error) {
      throw new Error(`搜索失败: ${error instanceof Error ? error.message : '未知错误'}`);
    }
  }

  private async braveSearch(query: string, count: number): Promise<BraveSearchResult[]> {
    const response = await httpsRequest('https://api.search.brave.com/res/v1/web/search', {
      method: 'GET',
      headers: {
        'Accept': 'application/json',
        'X-Subscription-Token': this.apiKey
      },
      params: {
        q: query,
        count: Math.min(count, 40).toString()
      }
    });

    if (response.status !== 200) {
      throw new Error(`Brave Search API 错误: ${response.status} ${response.statusText}`);
    }

    const data: BraveSearchResponse = JSON.parse(response.data);
    
    if (!data.web?.results) {
      throw new Error('API 返回数据格式错误');
    }

    console.log(`✅ 获取到 ${data.web.results.length} 条搜索结果`);
    return data.web.results;
  }

  private formatResults(query: string, results: BraveSearchResult[]): string {
    if (results.length === 0) {
      return `没有找到关于 "${query}" 的搜索结果。`;
    }

    let output = `🔍 搜索 "${query}" 的结果 (共 ${results.length} 条):\n\n`;
    
    results.forEach((result, index) => {
      output += `${index + 1}. **${result.title}**\n`;
      output += `   📄 ${result.description}\n`;
      output += `   🔗 ${result.url}\n\n`;
    });

    return output;
  }
}